package com.lee.app.service.impl;

import com.lee.app.entity.User;
import com.lee.app.entity.UserRole;

import com.lee.app.mapper.UserMapper;
import com.lee.app.mapper.UserNoMapper;
import com.lee.app.mapper.UserRoleMapper;
import com.lee.app.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author Lee
 */
@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserNoMapper userNoMapper;

    @Autowired
    private UserRoleMapper userRoleMapper;

    @Override
    public User login(User user) {
        return userMapper.selectByUsernameAndPassword(user);
    }

    @Override
    public List<User> list() {
        return userMapper.selectWithUserNo();
    }

    @Override
    public User selectById(Integer id) {
        return userMapper.selectByIdWithUserNo(id);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void insert(User user, Integer[] roleIds) {
        // 插入用户的基本信息
        userMapper.insert(user);

        // 将该用户所使用的用户编号的状态修改为0
        userNoMapper.updateStatusById(0, user.getUserNoId().getId());

        // 获取用户主键
        Integer userId = user.getId();

        // 设置该用户在用户角色中间表中的记录
        insertUserRole(roleIds, userId);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateById(User user, Integer[] roleIds) {

        // 更新用户的基本信息
        userMapper.updateById(user);

        // 根据用户主键删除该用户在用户角色中间表中的所有记录
        Integer userId = user.getId();
        userRoleMapper.deleteByUserId(userId);

        // 重新设置该用户在用户角色中间表中的记录
        insertUserRole(roleIds, userId);
    }

    /**
     * 设置该用户在用户角色中间表中的记录
     *
     * @param roleIds 用户角色ID数组
     * @param userId  用户ID
     */
    private void insertUserRole(Integer[] roleIds, Integer userId) {
        if (roleIds != null && roleIds.length > 0) {
            UserRole userRole = new UserRole();
            for (Integer roleId : roleIds) {
                userRole.setRoleId(roleId);
                userRole.setUserId(userId);
                userRoleMapper.insert(userRole);
            }
        }
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteById(Integer id) {
        // 根据用户主键查询用户的全部信息，包括用户编号信息
        User user = userMapper.selectByIdWithUserNo(id);

        // 根据用户主键删除其在用户角色中间表中的全部记录
        userRoleMapper.deleteByUserId(id);

        // 根据用户主键删除其用户表中的记录
        userMapper.deleteById(id);

        // 将该用户所使用的用户编号的状态修改为1
        userNoMapper.updateStatusById(1, user.getUserNoId().getId());
    }






}
